package com.fh.shop.api.interceptor;

import com.fh.shop.api.annotation.Idempotence;
import com.fh.shop.api.common.ResponseEnum;
import com.fh.shop.api.common.ServerResponse;
import com.fh.shop.api.exception.IdempotenceException;
import com.fh.shop.api.util.KeyUtil;
import com.fh.shop.api.util.RedisUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

public class IdempotenceInterceptor extends HandlerInterceptorAdapter {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (!(handler instanceof HandlerMethod)) {
            // 放行
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        if (!method.isAnnotationPresent(Idempotence.class)) {
            return true;
        }
        // 幂等性处理
        String header = request.getHeader("x-idempotence");
        if (StringUtils.isBlank(header)) {
            throw new IdempotenceException(ResponseEnum.IDEMPOTENCE_HEADER_IS_NULL);
        }
        // 验证头信息是否合法
        // 验证头信息是否超时
        // 使用完后，及时删除标识位
        // 验证是否是重复请求
        long delete = RedisUtil.delete(KeyUtil.buildTokenKey(header));
        // 删除后的返回值是1，则证明是第一次请求，那么放行
        // 如果是0，那么证明后续的重复请求了，那就拦截，提示；
        if (delete == 0) {
            throw new IdempotenceException(ResponseEnum.IDEMPOTENCE_REQUEST_IS_REPEAT);
        }
        return true;
    }
}
